#ifndef OCK_MEMORY_BRIDGE_HMM_MEMORY_POOL_H
#define OCK_MEMORY_BRIDGE_HMM_MEMORY_POOL_H
#include <memory>
#include "ock/hmm/mgr/OckHmmHeteroMemoryLocation.h"

namespace ock {
namespace hmm {

class OckHmmMemoryGuard
{
public:
    virtual ~OckHmmMemoryGuard() noexcept = default;
    virtual uintptr_t Addr(void) const;
    virtual hmm::OckHmmHeteroMemoryLocation location(void) const = 0;
    virtual uint64_t ByteSize(void) const = 0;
};

std::ostream &operator<<(std::ostream &os, const OckHmmMemoryGuard &data);

class OckHmmMemoryPool
{
public:
    virtual ~OckHmmMemoryPool() noexcept = default;
    virtual std::unique_ptr<OckHmmMemoryGuard> Malloc(uint64_t size, OckHmmMemoryAlloctePolicy policy) = 0;
    virtual uint8_t *AllocateHost(size_t byteSize) = 0;
    virtual void DeallocateHost(uint8_t* addr, size_t byteSize) = 0;
};

}
}
#endif

